package services

import (
	"gitee.com/kun_liu/to-log/app/models"
	"gitee.com/kun_liu/to-log/pkg/database"
	"gorm.io/gorm"
)

// PageService 页面服务
type PageService struct {
	db *gorm.DB
}

// NewPageService 创建页面服务
func NewPageService() *PageService {
	return &PageService{
		db: database.GetDB(),
	}
}

// GetPages 获取页面列表
func (s *PageService) GetPages(page, pageSize int) ([]models.Page, int64, error) {
	var pages []models.Page
	var total int64

	// 获取总数
	s.db.Model(&models.Page{}).Where("type = ?", "page").Count(&total)

	// 获取分页数据
	result := s.db.Where("type = ?", "page").Order("created DESC").Limit(pageSize).Offset((page - 1) * pageSize).Find(&pages)

	return pages, total, result.Error
}

// GetPageBySlug 根据别名获取页面
func (s *PageService) GetPageBySlug(slug string) (models.Page, error) {
	var page models.Page
	result := s.db.Where("slug = ? AND type = ?", slug, "page").First(&page)
	if result.Error != nil {
		return page, result.Error
	}

	// 增加阅读次数
	s.db.Model(&page).UpdateColumn("views", gorm.Expr("views + ?", 1))

	return page, nil
}

// GetPageByID 根据ID获取页面
func (s *PageService) GetPageByID(id uint) (models.Page, error) {
	var page models.Page
	result := s.db.First(&page, id)
	if result.Error != nil {
		return page, result.Error
	}

	return page, nil
}

// CreatePage 创建页面
func (s *PageService) CreatePage(page *models.Page) error {
	// 开始事务
	tx := s.db.Begin()
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
		}
	}()

	// 创建页面
	if err := tx.Create(page).Error; err != nil {
		tx.Rollback()
		return err
	}

	// 提交事务
	return tx.Commit().Error
}

// UpdatePage 更新页面
func (s *PageService) UpdatePage(page *models.Page) error {
	// 开始事务
	tx := s.db.Begin()
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
		}
	}()

	// 更新页面
	if err := tx.Save(page).Error; err != nil {
		tx.Rollback()
		return err
	}

	// 提交事务
	return tx.Commit().Error
}

// DeletePage 删除页面
func (s *PageService) DeletePage(id uint) error {
	// 开始事务
	tx := s.db.Begin()
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
		}
	}()

	// 获取页面
	var page models.Page
	if err := tx.First(&page, id).Error; err != nil {
		tx.Rollback()
		return err
	}

	// 删除页面
	if err := tx.Delete(&page).Error; err != nil {
		tx.Rollback()
		return err
	}

	// 提交事务
	return tx.Commit().Error
}
